package verfahren;

import controll.SchedulingSimulatorController;

public class LongestJobFirst extends SchedulingVerfahren {

	Thread t;
	double wartezeit = 0;
	int tmp = 1;
	
	public LongestJobFirst(int anzahlThreads, int[] cpuLaufZeit, SchedulingSimulatorController controller) {
		super(anzahlThreads, cpuLaufZeit, controller);
	}

	@Override
	public void verwalteThreads() {

		sort();	
		for (MyThread th : threads) {
			th.t.start();
			while (th.t.isAlive()) {
				// warte bis Threads fertig ist
			}

			/*
			 * Zeiche ein neues Rechteck und aktualisiere GUI
			 */
			if(th.getlaufZeit() != 0) {
				controller.getView().addRect(th.getID(), th.getGelaufeneZeit(), th.getGewarteteZeit(), th.getColor());
				controller.getView().reDraw();
			}
			summe += th.getlaufZeit();
			
			laufzeit += summe;
			if(tmp != threads.length) wartezeit +=summe;
			tmp ++;
		}
	
		laufzeit = laufzeit/threads.length;
		wartezeit = wartezeit/threads.length;
	}

	public void erzeugeThreads() {
		for (int i = 0; i < threads.length; i++) {
			threads[i] = new MyThread(i+1,cpuLaufZeit[i],randomColor());
		}
	}

	/**
	 * Sortiert die Threads nach ihrer Laufzeit absteigend
	 */
	public void sort() {
		MyThread temp;
		boolean unsortiert = true;

		while (unsortiert) {
			unsortiert = false;
			for (int i = threads.length - 1; i > 0; i--)
				if (threads[i].getlaufZeit() > threads[i - 1].getlaufZeit()) {
					temp = threads[i];
					threads[i] = threads[i - 1];
					threads[i - 1] = temp;
					unsortiert = true;
				}
		}
	}

	@Override
	public double berechneLaufZeit() {
		return laufzeit;
	}

	@Override
	public double berechneWartezeit() {
		return wartezeit;
	}

}
